"""
数据读取模块
"""

from typing import Tuple
import numpy as np
import pandas as pd
from .exceptions import DataFormatError, FileIOError


class DataReader:
    """数据读取器类"""
    
    def __init__(self, file_path: str):
        """
        初始化数据读取器
        
        Args:
            file_path: Excel文件路径
        """
        self.file_path = file_path
    
    def read_excel(self) -> Tuple[np.ndarray, np.ndarray]:
        """
        读取Excel文件并分离标签和光谱数据
        
        Returns:
            Tuple[np.ndarray, np.ndarray]: (标签数组, 光谱数据数组)
        """
        try:
            # 读取Excel文件
            df = pd.read_excel(self.file_path)
            
            # 验证数据不为空
            if df.empty:
                raise DataFormatError("Excel文件为空")
            
            # 分离标签（第一列）和光谱数据（其余列）
            labels = df.iloc[:, 0].values
            spectra_data = df.iloc[:, 1:].values
            
            # 验证数据
            if not self.validate_data(spectra_data):
                raise DataFormatError("光谱数据格式无效")
            
            return labels, spectra_data
            
        except Exception as e:
            if isinstance(e, (DataFormatError, FileIOError)):
                raise
            raise FileIOError(f"读取Excel文件失败: {str(e)}")
    
    def validate_data(self, data: np.ndarray) -> bool:
        """
        验证数据格式和完整性
        
        Args:
            data: 待验证的数据数组
            
        Returns:
            bool: 数据是否有效
        """
        if data is None or data.size == 0:
            return False
        
        # 检查是否包含非数值数据
        if not np.issubdtype(data.dtype, np.number):
            return False
        
        # 检查是否包含无穷大或NaN值
        if np.any(np.isinf(data)) or np.any(np.isnan(data)):
            return False
        
        return True